/**
 * 邻接表
 * 出边数组数组 e[u][i] 存储所有以 u 点为出度的边，其中终点为 v，边权位 w
 * 时间复杂度: O(n + m)
 * 空间复杂度： O(n + m)
 * 注意：这种形式的邻接表不能处理方向边（这里有点不能理解，似乎是在说编号信息无法得到存储）
 */
#include <iostream>
#include <vector>
using namespace std;
const int MAX = 40007;
struct Edge {
  // 其中 v 是入度点，w 是权值
  int v, w;
};

// 数组e的每一个元素，后面都可以拉出一个 vector 链
vector<Edge> e[MAX];

// int vis[MAX];
// 这次，我们不使用判重数组，使用父节点来避免深搜时出现回路
void dfs(int u, int fa) {
  for (auto ed : e[u]) {
    if (ed.v == fa)
      continue;
    cout << u << ", " << ed.v << ", " << ed.w << endl;
    dfs(ed.v, u);
  }
}